/**
 * Copyright (c) 2011 eelpo.com
 * All rights reserved.
 */
package com.eelpo.common.util;

import java.text.DecimalFormat;

/**
 * 数字处理、转换工具类(字符转数字时，数字不能为科学计数法)
 * 
 * @author <a href="mailto:Brian@eelpo.com">汪洪州</a>
 * @since 1.0
 */
public class NumberFormatUtils {

	/**
	 * 将双精度浮点类型数据转换成指定格式的字符串
	 * 
	 * @param d
	 *            双精度浮点类型数据
	 * @param pattern
	 *            转换格式
	 * @return 返回转换后的字符串
	 */
	public static String format(double d, String pattern) {

		if (BlankUtils.isBlank(pattern)) {
			throw new IllegalArgumentException("pattern is null.");
		}

		return new DecimalFormat(pattern).format(d);
	}

	/**
	 * 将 长整型数据转换成指定格式的字符串
	 * 
	 * @param l
	 *            长整型数据
	 * @param pattern
	 *            转换格式
	 * @return 返回转换后的字符串
	 */
	public static String format(long l, String pattern) {

		if (BlankUtils.isBlank(pattern)) {
			throw new IllegalArgumentException("pattern is null.");
		}

		return new DecimalFormat(pattern).format(l);
	}

	/**
	 * 将数字封装类的数字转换成指定格式的字符串
	 * 
	 * @param number
	 *            数字封装类
	 * @param pattern
	 *            转换格式
	 * @return 返回转换后的字符串
	 */
	public static String format(Number number, String pattern) {

		if (BlankUtils.isBlank(number)) {
			throw new IllegalArgumentException("number is null");
		}

		if (BlankUtils.isBlank(pattern)) {
			throw new IllegalArgumentException("pattern is null.");
		}
		return new DecimalFormat(pattern).format(number);
	}

	/**
	 * 格式化双精度数字为“#,##0.00”标准货币格式
	 * 
	 * @param d
	 *            需要格式化的双精度数字
	 * @return 返回格式化过的字符串
	 */
	public static String format(double d) {
		return format(d, "#,##0.00");
	}

	/**
	 * 格式化长整形数字为“#,##0”格式
	 * 
	 * @param l
	 *            需要格式化的长整形数字
	 * @return 返回格式化过的字符串
	 */
	public static String format(long l) {
		return format(l, "#,##0");
	}

	/**
	 * 除去字符串中的所有逗号分割符（,）
	 * 
	 * @param number
	 *            带逗号分割符的数字字符串
	 * @return 返回不含分割符的数字字符串
	 */
	private static String toToken(String number) {

		if (BlankUtils.isBlank(number)) {
			throw new IllegalArgumentException("number is null");
		}

		return number.replace(",", "");
	}

	/**
	 * 将数字字符串转换成int型数字,自动剔除逗号分割符
	 * 
	 * @param number
	 *            数字字符串
	 * @return 返回int类型数字
	 */
	public static int toInt(String number) {
		return Integer.parseInt(toToken(number));

	}

	/**
	 * 将数字字符串转换成Integer型数字,自动剔除逗号分割符
	 * 
	 * @param number
	 *            数字字符串
	 * @return 返回Integer类型数字
	 */
	public static Integer toCInt(String number) {
		return Integer.valueOf(toToken(number));
	}

	/**
	 * 将数字字符串转换成long型数字,自动剔除逗号分割符
	 * 
	 * @param number
	 *            数字字符串
	 * @return 返回long类型数字
	 */
	public static long toLong(String number) {
		return Long.parseLong(toToken(number));

	}

	/**
	 * 将数字字符串转换成Long型数字,自动剔除逗号分割符
	 * 
	 * @param number
	 *            数字字符串
	 * @return 返回Long类型数字
	 */
	public static Long toCLong(String number) {
		return Long.valueOf(toToken(number));
	}

	/**
	 * 将数字字符串转换成float型数字,自动剔除逗号分割符
	 * 
	 * @param number
	 *            数字字符串
	 * @return 返回float类型数字
	 */
	public static float toFloat(String number) {
		return Float.parseFloat(toToken(number));

	}

	/**
	 * 将数字字符串转换成Float型数字,自动剔除逗号分割符
	 * 
	 * @param number
	 *            数字字符串
	 * @return 返回Integer类型数字
	 */
	public static Float toCFloat(String number) {
		return Float.valueOf(toToken(number));
	}

	/**
	 * 将数字字符串转换成double型数字,自动剔除逗号分割符
	 * 
	 * @param number
	 *            数字字符串
	 * @return 返回double类型数字
	 */
	public static double toDouble(String number) {
		return Double.parseDouble(toToken(number));

	}

	/**
	 * 将数字字符串转换成Double型数字,自动剔除逗号分割符
	 * 
	 * @param number
	 *            数字字符串
	 * @return 返回Double类型数字
	 */
	public static Double toCDouble(String number) {
		return Double.valueOf(toToken(number));
	}
}
